home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tango2.lha / SOURCES / 1PIXELSINE.S < prev    next >
Text File  |  1988-07-19  |  12KB  |  574 lines

  1. ; ****************************************
  2. ; ** 1 PIXEL SINE SCROLL IN 1 FRAME !!! **
  3. ; **  BY  T A N G O  OF  C R Y P T I C  **
  4. ; ****************************************
  5.  
  6.     opt c-
  7.     section blitter,code_c            Chip Ram please !!
  8.     include    df1:definitions            Give me some hardware reggies
  9.     include    df1:macros                Give me some macros
  10.     
  11.         
  12. ;LOCAL CONSTANTS
  13.  
  14. icra        equ $bfed01                
  15. allocmem     =-30-168                
  16. freemem     =-30-180                
  17.  
  18. TAKEOVER:
  19.  
  20. ; KILL SYSTEM COPPER, KEYBOARD ETC.....
  21.  
  22.     LEA custom,a5        
  23.     LEA GFXLIB(PC),a1             Point to 'graphics.library'
  24.     MOVEQ #0,D0                     Doesn't matter which version
  25.      MOVE.L 4.w,a6                 EXECBASE
  26.     jsr    -132(a6)                 task switching off (forbid)
  27.      JSR -$228(a6)                  Openlibrary
  28.      MOVE.L D0,GFXBASE             Store library address
  29.  
  30.         
  31. ;Now put the graphic addresses in the CopperList         
  32.  
  33.  
  34.      move.l    #sprite,d1            
  35.      move.w    d1,sp0lo+2
  36.      swap    d1
  37.      move.w    d1,sp0hi+2
  38.  
  39.  
  40.      move.l GFXBASE,d0            Move gfxbase offset to d0
  41.      MOVE.L D0,A6                
  42.      MOVE.W #$80,dmacon(a5)        Turn off copper whilst changing it
  43.      MOVE.L $32(A6),WBCOPPER         Store old (WBench) copper address
  44.      MOVE.L #OURCOPPER,$32(A6)    Point to new copper list (our own)
  45.      MOVE.W #$8080,dmacon(a5)    re-enable copper
  46.  
  47.      MOVE.W #$8010,intena(a5)        
  48.      MOVE.L $6c,old                Save work bench interrupt
  49.      MOVE.L #LEV3,$6c            This sets up a level 3 interrupt
  50.     move.w    intenar(a5),systemints
  51.     move.b    #%01111111,icra        Kill keyboard
  52.         
  53. WAIT:     
  54.     BTST #6,$BFE001                This waits for the left
  55.      BNE.S    WAIT                mouse button to be pressed
  56.     move.l    4.w,a6                EXECBASE
  57.      MOVE.L old,$6c                Restore system interrupts
  58.     MOVE.L GFXBASE,A6
  59.      MOVE.W #$80,dmacon(a5)        Disable DMA
  60.      MOVE.L WBCOPPER,$32(A6)        Restore old copperlist
  61.      MOVE.W #$8080,dmacon(a5)    Enable DMA
  62.      move.w    systemints,d0        Systems interrupt
  63.      or.w    #$c000,d0
  64.      move.w    d0,intena(a5)        Enable OS interrupts
  65.      move.b    #%10011011,icra        Enable keyboard
  66.     clr.w    $dff0a8                Clear music
  67.     clr.w    $dff0b8
  68.     clr.w    $dff0c8
  69.     clr.w    $dff0d8
  70.     move.w    #$f,$dff096
  71.     CLR.L    D0
  72.     rts
  73.  
  74.  
  75. ERROR:    
  76.     move.l 4.w,a6                Get EXECBASE
  77.     jsr    -138(a6)                Permit ( multi-tasking on )
  78.     moveq    #0,d0                Clear d0
  79.      RTS                            Return to AmigaDOS
  80.  
  81.  
  82. ;This is the NEW level 3 interrupt
  83.  
  84. LEV3:
  85.      MOVEM.L d0-d7/a0-a6,-(sp)    Save all registers to the stack
  86.     lea    custom,a5
  87.     AND #$10,intreqr(a5)           Check if interrupt is from Copper 
  88.     BNE out
  89.     move.w    #$8010,$9c                                
  90.     
  91.  
  92. ; ** ALL ROUTINES CALLED (HOPEFULLY) EVERY VBI **
  93.  
  94.     MOVE.W #$FFF,$DFF180
  95.     bsr    try_sin
  96.     bsr    testscroll
  97.  
  98.      move.l    sin_screen,d1        Bitplane memory address
  99.     move.w    d1,bp1lo+2            Used for double buffering
  100.      swap    d1
  101.      move.w    d1,bp1hi+2
  102.  
  103.     bsr        move_stars
  104.     MOVE.W #$000,$DFF180
  105.     
  106.     
  107. out:     
  108.     MOVEM.L (sp)+,d0-d7/a0-a6    Restore the registers
  109.     DC.W $4ef9                    hex value for  JMP instruction
  110. old:     
  111.     DC.L 0                        will jump to normal interrupt
  112.  
  113.  
  114. ; ** Move the sprites **
  115.  
  116. move_stars:
  117.  
  118.     sub.b    #$1,x+1
  119.     sub.b    #$2,x+9
  120.     sub.b    #$1,x+17
  121.     sub.b    #$3,x+25
  122.     sub.b    #$2,x+33
  123.     sub.b    #$4,x+41
  124.     sub.b    #$2,x+49
  125.     sub.b    #$1,x+57
  126.     sub.b    #$3,x+65
  127.     sub.b    #$1,x+73
  128.     sub.b    #$2,x+81
  129.     sub.b    #$4,x+89
  130.     sub.b    #$3,x+97
  131.     sub.b    #$2,x+105
  132.     sub.b    #$1,x+113
  133.     sub.b    #$4,x+121
  134.     sub.b    #$3,x+129
  135.     sub.b    #$3,x+137
  136.     sub.b    #$2,x+145
  137.     sub.b    #$4,x+153
  138.     sub.b    #$1,x+161
  139.     sub.b    #$3,x+169
  140.     sub.b    #$1,x+177
  141.     sub.b    #$2,x+185
  142.     sub.b    #$4,x+193
  143.     sub.b    #$1,x+201
  144.     sub.b    #$3,x+209
  145.     sub.b    #$1,x+217
  146.     sub.b    #$2,x+225
  147.     sub.b    #$2,x+233
  148.     rts
  149.  
  150.  
  151. ; ** Double Buffer The Screen **
  152.  
  153. Buff:
  154.     Eor.l    #10240,Tango                ; Next screen is 10240 bytes along
  155.     Move.l    Tango,D1
  156.     Move.l    #SinePlane,d2
  157.     Add.l    D1,d2
  158.     Move.l    D2,Sin_Screen
  159.     Rts
  160.  
  161.  
  162. ; ** THE SCROLL ROUTINE **
  163.  
  164. testscroll:
  165.     tst.l    stopper
  166.     beq.s    scroll
  167.     sub.l    #1,stopper
  168.     rts
  169. scroll:
  170.     cmp.l    #15*4,val                Blitshifted all <<<
  171.     blo.s    coarse_scroll_it        No then get doing it !!
  172.     bsr        blit_char                Blit letter to screen
  173.     clr.l    val                        Reset index
  174. coarse_scroll_it:
  175.     bsr        coarse                    Scroll all line
  176.     rts                            
  177.     
  178.     
  179. ; ** BLIT LETTER ON THE SCREEN **
  180.  
  181. blit_char
  182.     jsr        text
  183.     lea        custom,a5                Get custom chip address
  184.     move.l    screenx,a0                 Can~t see this picture !!
  185.     move.l    #font,a1                 Put font in blitter source
  186.     add.l    d1,a1
  187. blit_test:
  188.     btst    #14,$dff002                 Blitter busy !!!
  189.     bne    blit_test                     Lets wait till she finishes !
  190.     move.w    #$ffff,bltafwm(a5)        
  191.     move.w    #$ffff,bltalwm(a5)        
  192.     move.l    a0,bltdpth(a5)             Blitter dest D (BOTTOM OF SCREEN)
  193.     move.l    a1,bltapth(a5)             Blitter source A (SCROLLING FONT)
  194.     move.w    #38,bltamod(a5)             Modulo (20-1)*2
  195.     move.w    #38,bltdmod(a5)             Modulo (20-1)*2
  196.     move.w    #$9f0,bltcon0(a5)         Minterms D=A
  197.     clr.w    bltcon1(a5)                 Set Ascending mode
  198.      move.w    #16*64+1,bltsize(a5)     Blit size (SIZE OF FONT)
  199.     rts                                  Return
  200.  
  201.  
  202. ; ** BLITSHIFT THE ENTIRE SCROLL LINE **
  203.  
  204. coarse:
  205.     lea        custom,a5                 
  206.     move.l    screenx,a0                ; Can~t see this picture !!
  207.     move.l    a0,a1
  208.     add.l    #2,a1
  209. blit_wait:
  210.     btst    #14,$dff002            
  211.     bne        blit_wait
  212.     incl    #4,val                    ; (1 for slower)
  213.     move    #15,d7                    ; Amount of pixels to shift(15 for slow)
  214.     ror        #4,d7                    ; Set to correct bits (12-15)
  215.     or        #%100111110000,d7        
  216.     move.l    #-1,bltafwm(a5)
  217.     move.l    a1,bltapth(a5)
  218.     move.l    a0,bltdpth(a5)
  219.     move.w    #0,bltamod(a5)
  220.     move.w    #0,bltdmod(a5)
  221.     move.w    d7,bltcon0(a5)    
  222.     move.w    #80*64+20,bltsize(a5)
  223.     rts    
  224.  
  225.  
  226. ; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **
  227.  
  228. CLEAR:
  229.     Move.l    Sin_Screen,a0
  230. wate
  231.     btst    #14,$dff002
  232.     bne.s    wate
  233.     Move.l    a0,Bltdpth(a5)
  234.     Move    #0,Bltdmod(a5)
  235.     Move.l    #$1f00000,Bltcon0(a5)
  236.     Move    #150*64+20,Bltsize(a5)
  237.     Rts
  238.  
  239.  
  240. ; ** DO THE SINEWAVE **
  241. ; BLITTER HAS TO COPY EVERY 2 PIXELS ACROSS, THATS ALOT OF WORK !!!
  242.  
  243. try_sin:
  244.     Bsr        buff
  245.     bsr        clear
  246.     Move.l    Table1,A3
  247.     Move.b    (A3),d1
  248.     Cmp.b    #$ff,d1
  249.     Bne        ItsOkYa
  250.     Move.l    #SinTab,A3
  251. ItsOkYa
  252.     Add.l    hi_amplitude,A3
  253.     Move.l    a3,Table1
  254.     Move.l    A3,Table
  255.     lea        custom,a5                 
  256.     MOVE.W    #$DFC,D2                ; D=A+B
  257.     LEA        BLTAFWM(A5),A2            ; FWM           IN A2
  258.     LEA     BLTSIZE(A5),A4            ; BLITSIZE        IN A4
  259.     LEA        BLTAPTH(A5),A6
  260.     MOVE.W    #16*64+1,D7                ;                IN D3
  261.     move.l    screenx,a0                 ; Source A
  262.     move.l    #20,d4                    ; Number of chars along screen
  263.     clr.l    d5
  264.     clr.l    d6
  265. ban:
  266.     MOVE.W    #%1000000000000000,d3    ; PUT TO 1 FOR ONE PIXEL 
  267. blit_test0:      
  268.     BSR        BLIT_WAITMAN
  269.     move.w    D2,bltcon0(a5)         
  270.     clr.w    bltcon1(a5)                 
  271.     move.w    #38,bltamod(a5)             
  272.     move.w    #38,bltdmod(a5)             
  273.     move.w    #38,bltbmod(a5)             
  274.      REPT    16
  275.     move.l    sin_screen,a1
  276.     bsr        get_sinvalue
  277.     move.w    d3,(A2)                    ; FWM MASK
  278.     move.l    a1,bltdpth(a5)             
  279.     move.l    a1,bltbpth(a5)             
  280.     move.l    a0,(A6)
  281.     MOVE.W    D7,(A4)                    ; BLITSIZE
  282.     LSR        #1,D3
  283.     ENDR
  284.     add.l    #2,a0                    ; Get next letter along
  285.     add.l    #2,d6
  286.     dbf        d4,ban
  287.     rts                                  
  288.  
  289.  
  290.  
  291. BLIT_WAITMAN:
  292.     BTST    #14,$DFF002
  293.     BNE.S    BLIT_WAITMAN
  294.     RTS
  295.     
  296.     
  297. get_sinvalue:
  298.     Clr.l    D5
  299.     Move.l    Table,A3
  300.     Move.b    (A3),d5
  301.     cmp.b    #$ff,d5
  302.     bne        cryptic90
  303.     Move.l    #SinTab,A3
  304.     Move.b    (a3),d5
  305. cryptic90
  306.     Add.l    lo_amplitude,A3
  307.     Move.l    A3,Table
  308. *    mulu    #40,d5
  309.     add.l    d5,a1
  310.     Add.l    D6,A1
  311.     rts
  312. Table1:    Dc.l    SinTab    
  313. table:    dc.l    sintab
  314.  
  315.  
  316. ; ** RAY SEE IF YOU CAN GET A BETTER SINUS TABLE FOR FULL SCREEN !!! **
  317. sintab:
  318.     DC.B 40,40,40,80,80,120,120,160,160,200,200,240,240,200
  319.     DC.B 200,160,120,80,80,40,40,255,255,255
  320.     EVEN
  321.  
  322.     dc.b $3C,$3F,$42,$46,$49,$4C,$50,$53,$56,$59
  323.     dc.b $5C,$5F,$61,$64,$67,$69,$6B,$6D,$6F,$71
  324.     dc.b $72,$73,$75,$76,$76,$77,$77,$77,$77,$77
  325.     dc.b $77,$76,$76,$75,$73,$72,$71,$6F,$6D,$6B
  326.     dc.b $69,$67,$64,$61,$5F,$5C,$59,$56,$53,$50
  327.     dc.b $4C,$49,$46,$42,$3F,$3C,$38,$35,$31,$2E
  328.     dc.b $2B,$27,$24,$21,$1E,$1B,$18,$16,$13,$10
  329.     dc.b $E,$C,$A,$8,$6,$5,$4,$2,$1,$1
  330.     dc.b $0,$0,$0,$0,$0,$0,$1,$1,$2,$4
  331.     dc.b $5,$6,$8,$A,$C,$E,$10,$13,$16,$18
  332.     dc.b $1B,$1E,$21,$24,$27,$2B,$2E,$31,$35
  333.     dc.b $38,255
  334.      EVEN
  335.      
  336.  
  337. ; ** CHARACTER DECODER ROUTINE **
  338.  
  339. text:
  340.     move.l    acurent,a2                Get message
  341.     clr.l    d1                        
  342.     move.b    (a2)+,d1                Update it
  343.     move.b    d1,letter                Store in offset
  344.     cmp.b    #255,d1                    Check for end of message
  345.     beq.w    rst_text                If equal, then reset
  346.     cmp.b    #254,d1
  347.     beq        stop
  348.     sub.l    #32,d1                    Subract 32 (ie space)
  349.     asl        d1                        Times by 2 
  350.     move.l    a2,acurent                Update acurent
  351.     CMP.B    #"4",letter                Is letter "K" or larger
  352.     BPL.s    add_more                If larger then add on
  353.     rts                                Return
  354. add_more:
  355.     CMP.B    #"H",letter                Is letter "U" or larger
  356.     BPL.S    add_more2                If larger then add on
  357.     add.l    #40*15,d1                Get next line down (KLMNOPQRST)
  358.     rts
  359. add_more2:                    
  360.     add.l    #40*30,d1                Get next line down (UVWXYZ0123)
  361.     rts
  362. rst_text:
  363.     move.l    #0,d1
  364.     move.l    #message,d2                Get begining of text
  365.     move.l    d2,acurent                Reset to begining
  366.     rts                                Return
  367. stop:
  368.     move.l    #0,d1
  369.     add.l    #1,acurent
  370.     move.l    #150,stopper
  371.     rts
  372.  
  373. message:
  374.  
  375. ; 254=STOP,255=END.
  376.  
  377.     DC.B    " 1 PIXEL   !!!!!!      IN 1 FRAME !!!!      OPTIMIZATION BY TANGO OF CRYPTIC !!!"
  378.     DC.B    "  MULU INSTRUCTION TAKES FUKIN AGES TO EXECUTE !!!"
  379.     DC.B    "   WRAP           ",255
  380.     EVEN
  381.             
  382.  
  383. ; ** THE COPPERLIST **
  384.  
  385. OURCOPPER:
  386. sp0lo:    dc.w    spr0ptl,$0000
  387. sp0hi:    dc.w    spr0pth,$0000
  388.         dc.w    bpl1mod,0,bpl2mod,0
  389.         dc.w    diwstrt,$2c81+16,diwstop,$2cc1
  390.         dc.w    bplcon0,$1200,bplcon1,$0000
  391.         dc.w    ddfstrt,$38,ddfstop,$d0
  392. *        dc.w    color00,$000,color01,$094
  393.         dc.w    color16,$aaa,color17,$aaa,color18,$aaa
  394.         dc.w    color19,$aaa,color20,$aaa
  395. bp1lo:    dc.w    bpl1ptl,$0000
  396. bp1hi:    dc.w    bpl1pth,$0000
  397.         wait    $2c09,$fffe
  398.         dc.w    color01,$f00
  399.         wait    $2e09,$fffe
  400.         dc.w    color01,$f11
  401.         wait    $3009,$fffe
  402.         dc.w    color01,$f00
  403.         wait    $3209,$fffe
  404.         dc.w    color01,$f11
  405.         wait    $3409,$fffe
  406.         dc.w    color01,$f22
  407.         wait    $3609,$fffe
  408.         dc.w    color01,$f33
  409.         wait    $389,$fffe
  410.         dc.w    color01,$f44
  411.         wait    $3a09,$fffe
  412.         dc.w    color01,$f55
  413.         wait    $3c09,$fffe
  414.         dc.w    color01,$f66
  415.         wait    $3e09,$fffe
  416.         dc.w    color01,$f77
  417.         wait    $4009,$fffe
  418.         dc.w    color01,$f88
  419.         wait    $4209,$fffe
  420.         dc.w    color01,$f99
  421.         wait    $4409,$fffe
  422.         dc.w    color01,$faa
  423.         wait    $4609,$fffe
  424.         dc.w    color01,$fbb
  425.         wait    $4809,$fffe
  426.         dc.w    color01,$fcc
  427.         wait    $4a09,$fffe
  428.         dc.w    color01,$fdd
  429.         wait    $4c09,$fffe
  430.         dc.w    color01,$fee
  431.         wait    $4e09,$fffe
  432.         dc.w    color01,$fff
  433.         wait    $5109,$fffe
  434.         dc.w    color01,$eef
  435.         wait    $5309,$fffe
  436.         dc.w    color01,$ddf
  437.         wait    $5509,$fffe
  438.         dc.w    color01,$ccf
  439.         wait    $5709,$fffe
  440.         dc.w    color01,$bbf
  441.         wait    $5909,$fffe
  442.         dc.w    color01,$aaf
  443.         wait    $5b09,$fffe
  444.         dc.w    color01,$99f
  445.         wait    $5d09,$fffe
  446.         dc.w    color01,$88f
  447.         wait    $5f09,$fffe
  448.         dc.w    color01,$77f
  449.         wait    $6109,$fffe
  450.         dc.w    color01,$66f
  451.         wait    $6309,$fffe
  452.         dc.w    color01,$55f
  453.         wait    $6509,$fffe
  454.         dc.w    color01,$44f
  455.         wait    $6709,$fffe
  456.         dc.w    color01,$33f
  457.         wait    $6909,$fffe
  458.         dc.w    color01,$22f
  459.         wait    $6a09,$fffe
  460.         dc.w    color01,$11f
  461.         wait    $6c09,$fffe
  462.         dc.w    color01,$00f
  463.         wait    $6e09,$fffe
  464.         dc.w    color01,$11f
  465.         wait    $7109,$fffe
  466.         dc.w    color01,$22f
  467.         wait    $7309,$fffe
  468.         dc.w    color01,$33f
  469.         wait    $7509,$fffe
  470.         dc.w    color01,$44f
  471.         wait    $7709,$fffe
  472.         dc.w    color01,$55f
  473.         wait    $7909,$fffe
  474.         dc.w    color01,$66f
  475.         wait    $7a09,$fffe
  476.         dc.w    color01,$77f
  477.         wait    $7c09,$fffe
  478.         dc.w    color01,$88f
  479.         wait    $7e09,$fffe
  480.         dc.w    color01,$99f
  481.         wait    $8009,$fffe
  482.         dc.w    color01,$aaf
  483.         wait    $8209,$fffe
  484.         dc.w    color01,$bbf
  485.         wait    $8409,$fffe
  486.         dc.w    color01,$ccf
  487.         wait    $8609,$fffe
  488.         dc.w    color01,$ddf
  489.         wait    $8809,$fffe
  490.         dc.w    color01,$eef
  491.         wait    $8a09,$fffe
  492.         dc.w    color01,$fff
  493.         wait    $8c09,$fffe
  494.         dc.w    color01,$fee
  495.         wait    $8e09,$fffe
  496.         dc.w    color01,$fdd
  497.         wait    $9109,$fffe
  498.         dc.w    color01,$fcc
  499.         wait    $9309,$fffe
  500.         dc.w    color01,$fbb
  501.         wait    $9509,$fffe
  502.         dc.w    color01,$faa
  503.         wait    $9709,$fffe
  504.         wait    $9909,$fffe
  505.         dc.w    color01,$f99
  506.         wait    $9b09,$fffe
  507.         dc.w    color01,$f88
  508.         wait    $9d09,$fffe
  509.         dc.w    color01,$f77
  510.         wait    $9f09,$fffe
  511.         dc.w    color01,$f66
  512.         end_copper
  513.         
  514.  
  515. ;LOCAL CONSTANTS
  516.  
  517. WBCOPPER:        DC.L    0
  518. GFXLIB:            DC.B     "graphics.library",0
  519. GFXBASE:        DC.L    0
  520. systemints:        dc.l    0
  521. scroll_offset:    dc.l    0
  522. screenx:        dc.l    picture
  523. letter:            dc.b    0
  524. acurent:        dc.l    message
  525. val:            dc.l    0
  526. lo_amplitude:    dc.l    1                        ; PISS AROUND WITH THESE
  527. hi_amplitude:    dc.l    2                        ; PISS AROUND WITH THESE
  528. Tango            Dc.l    0
  529. sin_screen:        Dc.l    SinePlane
  530. stopper:        dc.l    0
  531.  
  532.  
  533. ;BINARY FILES TO BE INCLUDED
  534.     EVEN
  535. picture    
  536.     dcb.b    10240,0
  537. SinePlane
  538.     dcb.b    10240,0
  539.     dcb.b    10240,0
  540. font
  541.     incbin    df1:neatfont.bin
  542. sprite:
  543.     include    df1:sprite.list
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.     
  551.     
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.     
  560.     
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.     
  573.     
  574.